package com.lcc.lynx.jdbc;

import com.lcc.lynx.common.ResultVO;
import com.lcc.lynx.security.annotation.Permission;
import com.lcc.lynx.common.utils.ReflectUtil;
import com.lcc.lynx.jdbc.pojo.TablePojo;
import com.lcc.lynx.jdbc.util.JDBCReflectUtil;
import com.lcc.lynx.common.utils.StrUtil;
import org.springframework.web.bind.annotation.*;

import java.lang.reflect.Field;
import java.util.Arrays;

@RestController
public interface IByIdController<DV extends TablePojo> extends IBaseController<DV>{

    IByIdService<DV> getService();

    /**
     * 根据id查询
     * @param id
     * @return
     */
    @Permission(Permission.search)
    @GetMapping("/info/{id}")
    default ResultVO<DV> info(@PathVariable(required = false, name = "id") String id){
        if(StrUtil.isEmpty(id)){
            return ResultVO.fail("路径参数(id)不能为空");
        }
        return ResultVO.success(getService().selectById(id));
    }

    /**
     * 根据id是否为空,更新或插入
     * @param dto
     * @return
     */
    @Permission({Permission.upd, Permission.add})
    @RequestMapping("/save")
    default ResultVO<?> save(DV dto){
        Field field = JDBCReflectUtil.getTableIdField(dto);
        if(StrUtil.isEmpty(ReflectUtil.getFieldValue(dto, field))){
            return 0 == getService().insert(dto) ? ResultVO.fail("新增失败") : ResultVO.success();
        }
        return 0 == getService().updateById(dto) ? ResultVO.fail("更新失败") : ResultVO.success();
    }

    /**
     * 根据id更新
     * @param dto
     * @return
     */
    @Permission(Permission.upd)
    @RequestMapping("/update")
    default ResultVO<?> update(DV dto){
        Field field = JDBCReflectUtil.getTableIdField(dto);
        if(StrUtil.isEmpty(ReflectUtil.getFieldValue(dto, field))){
            return ResultVO.fail(field.getName() + "不能为空");
        }
        return 0 == getService().updateById(dto) ? ResultVO.fail("更新失败") : ResultVO.success();
    }

    /**
     * 根据id批量删除
     * @param idList
     * @return
     */
    @Permission(Permission.del)
    @RequestMapping("/delete")
    default ResultVO<?> delete(@RequestParam(required = false, name = "idList") String idList){
        if(StrUtil.isEmpty(idList)){
            return ResultVO.fail("参数(idList)不能都为空");
        }
        return 0 == getService().deleteByIdList(Arrays.asList(idList.split(",")))
                ? ResultVO.fail("删除失败") : ResultVO.success();
    }

}
